From: Sundeep Mediratta Date: Wed, 11 Oct 2023 10:31:19 +0000 (-0400) Subject: extensionSystem: Sort extensions before loading X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~281^2~2^2~239 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=3b4e3af6fad277705eba03b3c47dbc9503ef51a8;p=gnome-shell.git extensionSystem: Sort extensions before loading When an extension is disabled, we "rebase" all extensions that were enabled afterwards, in case they override the same method. This can be fairly expensive, in particular when disabling many extensions at once, for instance when locking the screen. Help with that by sorting extensions by the number of session-modes, as extensions that support multiple modes are less likely to be disabled on session mode changes. Part-of: --- diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index 3592e5b3a..a03d0f10f 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -583,6 +583,8 @@ export class ExtensionManager extends Signals.EventEmitter { if (!global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY)) extensions = extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY)); + extensions.sort((a, b) => this._compareExtensions(this.lookup(a), this.lookup(b))); + // filter out 'disabled-extensions' which takes precedence let disabledExtensions = global.settings.get_strv(DISABLED_EXTENSIONS_KEY); return extensions.filter(item => !disabledExtensions.includes(item)); @@ -700,6 +702,12 @@ export class ExtensionManager extends Signals.EventEmitter { } } + _compareExtensions(a, b) { + const modesA = a?.sessionModes ?? []; + const modesB = b?.sessionModes ?? []; + return modesB.length - modesA.length; + } + async _loadExtensions() { global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, () => { this._onEnabledExtensionsChanged(); @@ -748,7 +756,7 @@ export class ExtensionManager extends Signals.EventEmitter { } return extension; - }).filter(extension => extension !== null); + }).filter(extension => extension !== null).sort(this._compareExtensions.bind(this)); // after updating to a new major version, // update extensions before loading them